package com.dy.design_pattern_study.visitor_pattern.dome3.tools;

import com.dy.design_pattern_study.visitor_pattern.dome3.Element;
import com.dy.design_pattern_study.visitor_pattern.dome3.Visitor;

import java.util.ArrayList;
import java.util.List;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-25
 * @Content 对象结构，分配具体的对象去访问element
 *  工具访问类
 *  ObjectStructure类，能枚举它的元素，可以提供一个高层的接口以允许访问者访问它的元素。
 */
public class ObjectStructure {
    private List<Element> elements = new ArrayList<>();

    //增加 可以被访问的对象
    public void attach(Element element) {
        elements.add(element);
    }

    //删除被可访问的对象
    public void detach(Element element) {
        elements.remove(element);
    }

    public void accept(Visitor visitor) {
        //这里分配访问者去访问 Element
        for (Element element : elements) {
            //双分派技术
            //这里是静态分配 -静态分派就是 根据具体的第一级父类进行第一次的的分配
            //即 在jvm启动的时候进行的第一次分配
            //重载方法的分派是根据静态类型进行的，这个分派过程在编译时期就完成了
            element.accept(visitor);//
        }
    }
}
